﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    //ai bi result
    //1  3  0     
    //1  4  0   当区间重叠的时候，选择较小的bi，有利于后面包含更多的活动
    //3  5  1   
    //6  13 2
    //6  16 2   6与前一个13重叠，两个活动二选一，选择上一个活动，因为上一个活动的结束时间更小，结果不变，即求并集
    //14 16 3

    int n = 0;
    cin >> n;

    vector<pair<int, int>> vec(n);
    for (int i = 0; i < n; ++i)
    {
        cin >> vec[i].first >> vec[i].second;
    }

    sort(vec.begin(), vec.end());

    int result = 0, over = vec[0].second;
    for (int i = 1; i < n; ++i)
    {
        if (vec[i].first < over)//该活动开始时间小于上次活动结束时间，重叠，求交集
        {
            over = min(over, vec[i].second);//小的结束时间有利于选择更多的活动，result为什么不用更新，上面有解析，因为当前这个活动没有选择
        }
        else//无重叠，求并集
        {
            over = max(over, vec[i].second);
            ++result;
        }
    }

    cout << result + 1 << endl;//第一个区间也要包含
    return 0;
}

/*
给定n个活动，每个活动安排的时间为[ai,bi)。求最多可以选择多少个活动，
满足选择的活动时间两两之间没有重合。
输入描述：
第一行输入一个整数n(1≤n≤2⋅10^5)，表示可选活动个数。
接下来的n行，每行输入两个整数ai,bi(0≤ai<bi≤10^9)，表示第i个活动的时间。
输出描述：
输出一行一个整数，表示最多可选择的活动数。

示例1
输入：
3
1 4
1 3
3 5
输出：
2
*/

